#!/usr/bin/python
#
#    Copyright 2006 Andrew Wilkinson <aw@cs.york.ac.uk>.
#
#    This file is part of PyScobble (http://lastfm.indiegigs.co.uk/pyscrobble)
#
#    PyScobble is free software; you can redistribute it and/or modify
#    it under the terms of the GNU Lesser General Public License as published by
#    the Free Software Foundation; either version 2.1 of the License, or
#    (at your option) any later version.
#
#    PyScobble is distributed in the hope that it will be useful,
#    but WITHOUT ANY WARRANTY; without even the implied warranty of
#    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
#    GNU Lesser General Public License for more details.
#
#    You should have received a copy of the GNU Lesser General Public License
#    along with PyScobble; if not, write to the Free Software
#    Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
#

import sys

import scrobble
from lastfmreverseneighbours.gui import runGUI

def findReverseNeighbours(user, maxdepth, notify):
    scanned = [user]
    waiting = user.neighbours
    next_level = []
    depth = 1

    while depth < maxdepth:
        notify("maxprogress", len(scanned) + 25**(maxdepth-depth) + len(waiting))
        notify("progress", len(scanned))
        for u in waiting:
            scanned.append(u)
            if user in u.neighbours:
                yield u, u.neighbours.index(user)+1
            for n in u.neighbours:
                if n not in scanned + waiting + next_level:
                    next_level.append(n)
            notify("progress", len(scanned))
        waiting = next_level
        next_level = []
        depth += 1

    yield False

def notify(text, value):
    print text, value

def main():
    user = scrobble.User(sys.argv[1])

    people = findReverseNeighbours(user, int(sys.argv[2]), notify)

    while True:
        p = people.next()
        if p:
            print p
        else:
            break

if __name__ == "__main__":
    if len(sys.argv) == 3:
        main()
    else:
        runGUI(findReverseNeighbours)
